#include "link_list.h"

Link_list* init_link_list()         //创建链表
{
    Link_list * L = (Link_list *)malloc(sizeof(Link_list));
    if ((NULL == L))
    {
        printf("创建失败");
        return NULL;
    }
    else
    {
        L->head = NULL;
    }
    return L;
}

void Insert_Node(Link_list *list, Stu_t data, int index)        //初始化链表，任意位置插入链表
{
    Node * L = (Node *)malloc(sizeof(Node));
    L->data = data;
    if (NULL == L)
    {
        printf("链表不存在");
        return;
    }
    if (index == 0 || NULL == list->head)
    {
        L->next = list->head;
        list->head = L;
        return;
    }
    

    Node * N = list->head;
    for (int i = 0; i < index - 1 && NULL != N; i++)
    {
        N = N->next;
    }
    if (NULL == N)
    {
        printf("越界了");
        return;
    }
    L->next = N->next;
    N->next = L;
    return;
}

// 链表的删除
void Delete_Node(Link_list *list, int id)
{
    // 安全判断
    if ( NULL == list)
    {
        printf("表不存在\n");
        return ;
    }
    // 创建两个结点
    Node * p = list->head;
    Node * q = NULL;
    // 将 p 进行遍历
    for (int i = 0; i < id - 1 && p != NULL ; i++)
    {
        p = p->next;
    }
    // 将q 指向 p下一个   指向要删除的结点
    q = p->next;
    // 将p 的下一个结点 指向要删除结点的下一个
    p->next = q->next;

    free(q);
}

// 链表的查找
Link_list* Find_Node(Link_list *list, int id)
{
    Node * L = (Node * )malloc(sizeof(Node));
    L = list->head;
    if (list == NULL)
    {
        printf("表不存在");
        return NULL;
    }
    while (L != NULL)
    {
        if (L->data.id == id)
        {
            L->next = NULL;
            break;
        }
        L = L->next;
    }
    if (L == NULL)
    {
        printf("查无此人");
    }
    Link_list *S = (Link_list *)malloc(sizeof(Link_list));
    S->head = L;
    return S;
}

void printf_Link_List(Link_list *list)          //遍历打印
{
    Node * L = list->head;
    while (NULL != L)
    {
        printf("姓名 :%s\t",L->data.name);
        printf("性别 :%s\t",L->data.sex);
        printf("年龄 :%d\t",L->data.age);
        printf("学号 :%d\t",L->data.id);
        printf("成绩 :%d\n",L->data.sco);
        L = L->next;
    }
    return;
}


void free_Link_List(Link_list *list)            //链表的销毁
{
    Node * temp = NULL;
    Node * N = list->head;
    while (N != NULL)
    {
        temp = N;
        N = N->next;
        free(temp);
        temp = NULL;
    }
    free(list);
    return;
}

